# 带着二哈去旅行丶:ZZQ
# 生成时间：2021/8/2 17:33
import collections
import copy

print('---------------封装')

'''
# 提高程序的安全性,对属性和方法包装到类对象中.不希望在类外部使用，私有加__

class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def show(self):
        print(self.name, self.__age)     # self.__age 为私有，不能在外部使用


stu = Student('z', 21)
stu.show()
Student.show(stu)
# print(stu.__age)    # 不允许在外部使用
print(dir())  # 查看
'''
print('\n2---------------继承')
'''

class Person(object):  # 父类，Person继承object类
    def __init__(self, name, age):  # 初始化
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(Person):  # 子类
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no = stu_no

    def info(self):
        super().info()  # 调用父类的info  方法重写
        print(self.stu_no)


class Teacher(Person):
    def __init__(self, name, age, teacheryear):
        super().__init__(name, age)
        self.teacheryear = teacheryear

    def info(self):
        super().info()  # 调用父类info   方法重写
        print('教年：', self.teacheryear)


stu = Student('z', 23, '1001')
teacher = Teacher('t', 33, 10)

stu.info()      # 继承Person 调用info()方法
teacher.info()  # 继承Person
'''
print('\n3-------------------多继承')
'''
class A:      # 默认继承object类
    pass
class  B:
    pass
class C(A,B):      # 多继承
    pass
'''
print('\n4----------------str 重写object')

'''
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '我的名字是{0}，今年{1}岁'.format(self.name, self.age)


stu = Student('张', 21)
print(stu)  # 调用str
'''

print('\n5------------------多态')
'''
class Animal(object):
    def eat(self):
        print('动物吃')
class Dog(Animal):
    def eat(self):
        print('狗吃')
class Cat(Animal):      # 重写Animal
    def eat(self):
        print('猫吃')

class Person:
    def eat(self):
        print('人吃')
# 外部定义一个函数   动态语言 
def fun(obj):
    obj.eat()

fun(Cat())
fun(Dog())
fun(Animal())
fun(Person())
'''
print('\n6--------------特殊属性')
'''
class A:      # 默认继承object类
    pass
class  B:
    pass
class C(A,B):      # 多继承
    def __init__(self,name,age):
        self.name=name
        self.age=age
class D(A):
    pass
# 创建C类的对象
x=C('jack',22) # x是C的一个实例属性
print(x.__dict__)   # 实例对象的属性字典
print(C.__dict__)
print(x.__class__)  # 输出对象所属的类
print(C.__bases__)   # C类的父类元素
print(C.__base__)   # 类的基类
print(C.__mro__)    # 类的层次结构
print(A.__subclasses__())   # 子类的列表
'''
print('\n6--------------特殊方法')
'''
class Student:
    def __init__(self,name):
        pass
    def __add__(self, other):
        return self.name+other.name   # 使自定义对象可以相加+
    def __len__(self):
        return len(self.name)
# s=s1.__add__(s2)
s=s1+s2
print(len(lst)) # 列表长度
print(lst.__len__())
'''
# __new__ 用于创建对象
# __init__ 对创建的对象进行初始化     p117集


# 浅拷贝：只拷贝源对象，子对象不拷贝，源对象与拷贝对象会引用同一个子对象(地址一样)
#  import copy
#         c=copy.copy(C)

# 深拷贝使用copy模块的deepcopy函数，递归拷贝对象中包含的子对象源对象和拷贝对象的所有子对象也不相同（地址不同）
# import copy
#       c2=copy.deepcopycopy(C)
